﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BE;
using DAL;
using BE.SearchCriteria;
using BLL.Exceptions;
using BLL.Common;
using System.Transactions;

namespace BLL
{
    public class ArticuloBLL : BaseBLL
    {
        public static void Insertar(ArticuloBE pElemBE)
        {
            try
            {
                Validar(pElemBE);

                ArticuloDAL oArticuloDAL = new ArticuloDAL();
                oArticuloDAL.Insertar(pElemBE);

                // Asignar a los idarticulo de cada presentacion, el idarticulo nuevo
                pElemBE.Presentaciones.ForEach(x => x.IdArticulo = pElemBE.IdArticulo);

                PresentacionDAL oPresentacionDAL = new PresentacionDAL();
                oPresentacionDAL.InsertarPresentaciones(pElemBE.Presentaciones);

            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        public static void Modificar(ArticuloBE pElemBE, AccionesListBLL<int> pAccionesList)
        {
            try
            {
                Validar(pElemBE);

                ArticuloDAL oArticuloDAL = new ArticuloDAL();
                PresentacionDAL oPresentacionDAL = new PresentacionDAL();

                pElemBE.Presentaciones.ForEach(x => x.IdArticulo = pElemBE.IdArticulo); //se setea el idarticulo por las dudas le falte a alguno
                
                using (TransactionScope scope = new TransactionScope())
                {
                    oArticuloDAL.Modificar(pElemBE);

                    foreach (var accion in pAccionesList.AccionesElemento.Where(x => x.Value != AccionElemento.Ninguna))
                    {
                        if (accion.Value != AccionElemento.Eliminar)
                        {
                            PresentacionBE oElemBE = pElemBE.Presentaciones.Find(x => x.IdPresentacion == accion.Key);
                            if (oElemBE != null)
                            {
                                switch (accion.Value)
                                {
                                    case AccionElemento.Crear:
                                        oPresentacionDAL.Insertar(oElemBE);
                                        break;
                                    case AccionElemento.Editar:
                                        oPresentacionDAL.Modificar(oElemBE);
                                        break;
                                }
                            }
                        }
                        else
                        {
                            oPresentacionDAL.Eliminar(pElemBE.IdArticulo, accion.Key);
                        }

                    }
                    scope.Complete();
                }




                //oPresentacionDAL.DeleteByIdArticulo(pElemBE.IdArticulo);
                //oPresentacionDAL.InsertarPresentaciones(pElemBE.Presentaciones);

            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        private static void Validar(ArticuloBE pElemBE)
        {
            if (pElemBE.Presentaciones.Count == 0)
                throw new BLLException("Debe ingresar por lo menos una presentación.");

            if (pElemBE.Presentaciones.Exists(x => string.IsNullOrEmpty(x.Descripcion.Trim())))
                throw new BLLException("Debe ingresar una descripción para la presentación.");

        }

        public static ArticuloBE SeleccionarPorId(int pIdArticulo)
        {
            ArticuloDAL oArticuloDAL = new ArticuloDAL();
            PresentacionDAL oPresentacionDAL = new PresentacionDAL();

            ArticuloBE oArticuloBE = oArticuloDAL.SeleccionarPorId(pIdArticulo);
            if (oArticuloBE != null)
                oArticuloBE.Presentaciones = oPresentacionDAL.SeleccionarPorIdArticulo(pIdArticulo);

            return oArticuloBE;
        }

        public static List<ArticuloBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
        {
            ArticuloDAL oArticuloDAL = new ArticuloDAL();
            return oArticuloDAL.SeleccionarPorParametros(pFiltroSC, pPageSize, pPageNum, ref pCountReg);
        }

        public static void Delete(int pIdArticulo)
        {
            try
            {
                PresentacionDAL oPresentacionDAL = new PresentacionDAL();
                oPresentacionDAL.DeleteByIdArticulo(pIdArticulo);

                ArticuloDAL oArticuloDAL = new ArticuloDAL();
                oArticuloDAL.Delete(pIdArticulo);
            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            } 
        }


        public static List<ArticuloBE> SeleccionarArticulosPresentaciones(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
        {
            ArticuloDAL oArticuloDAL = new ArticuloDAL();
            List<ArticuloBE> wList = new List<ArticuloBE>();
            wList = oArticuloDAL.SeleccionarArticulosPresentaciones(pFiltroSC, pPageSize, pPageNum, ref pCountReg);

            //PresentacionDAL oPresentacionDAL = new PresentacionDAL();
            //foreach (var oArticuloBE in wList)
            //{
            //    oArticuloBE.Presentaciones = oPresentacionDAL.SeleccionarPorIdArticulo(oArticuloBE.IdArticulo);
            //}

        
           return wList;
          
        }
    }
}
